'use client'; import { useCallback, useState } from 'react'; import { fetchApi } from '@/lib/utils/client'; import { FollowMember, FollowListResponse } from '@/types/account/follow'; import FollowListItem from './FollowListItem'; type Mode = 'followers' | 'following'; type Props = { mode: Mode; memberSID: string; initialList: FollowMember[]; initialTotal: number; initialPage?: number; perPage?: number; }; export default function FollowList({ mode, memberSID, initialList, initialTotal, initialPage = 1, perPage = 20 }: Props) { const [list, setList] = useState(initialList); const [total, setTotal] = useState(initialTotal); const [nextPage, setNextPage] = useState(initialPage + 1); const [loading, setLoading] = useState(false); const [errorMessage, setErrorMessage] = useState(null); const hasMore = list.length < total; const endpointPath = mode === 'followers' ? 'followers' : 'following'; const loadMore = useCallback(async () => { if (loading || !hasMore) { return; } setLoading(true); setErrorMessage(null); try { const url = `/api/member/${encodeURIComponent(memberSID)}/${endpointPath}?page=${nextPage}&perPage=${perPage}`; const res = await fetchApi(url, { method: 'GET', silent: true }); if (!res.success || !res.data) { setErrorMessage(res.message ?? '목록을 불러오지 못했습니다.'); return; } const incoming = res.data.list; setList((prev) => { const seen = new Set(prev.map((m) => m.sid)); const dedup = incoming.filter((m) => !seen.has(m.sid)); return [...prev, ...dedup]; }); setTotal(res.data.total); setNextPage((p) => p + 1); } catch (err) { console.error('Follow list loadMore failed:', err); setErrorMessage(err instanceof Error ? err.message : '목록을 불러오지 못했습니다.'); } finally { setLoading(false); } }, [loading, hasMore, memberSID, endpointPath, nextPage, perPage]); if (list.length === 0) { const emptyText = mode === 'followers' ? '아직 팔로워가 없습니다.' : '아직 팔로우하는 회원이 없습니다.'; return

{emptyText}

; } const sectionLabel = mode === 'followers' ? '팔로워 목록' : '팔로우 목록'; return (

전체 {total.toLocaleString()}명

    {list.map((member) => ( ))}
{errorMessage && (

{errorMessage}

)} {hasMore && ( )}
); }